package com.gjszn.kh.controller.page;


import java.io.File;
import java.util.HashMap;
import java.util.UUID;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.joda.time.DateTime;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;

import com.alibaba.fastjson.JSONObject;
import com.gjszn.kh.model.User;
import com.gjszn.kh.service.UserService;
import com.gjszn.kh.utils.CIDUtils;
import com.gjszn.kh.utils.CheckUtil;

import net.coobird.thumbnailator.Thumbnails;

/**    
* @Title: RegisterController.java  
* @Package com.gjszn.kh.controller.page    
* @author jys@nx-yt.com    
* @date 2015年12月31日 上午9:48:44  
* @version V1.0    
* @Description: TODO(用一句话描述该文件做什么)
********************************************/
@Controller
public class RegisterController {
	
	private static Logger log = LogManager.getRootLogger();
	
	//定义允许上传的文件扩展名
	private static HashMap<String, String> extMap = new HashMap<String, String>();
	static{
		extMap.put("image", "gif,jpg,jpeg,png,bmp");
		extMap.put("flash", "swf,flv");
		extMap.put("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
		extMap.put("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
	}
	
	@Inject
	private UserService userService;
	
	/**
	 * 风险提示书
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/step/1", method=RequestMethod.GET)
	public String step_1(HttpServletRequest request){
		String base_url = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/register/view";
		request.getSession().setAttribute("base_url", base_url);
		return "fxts";
	}
	
	/**
	 * 客户须知
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/step/2", method=RequestMethod.GET)
	public String step_2(HttpServletRequest request){
		return "khxz";
	}
	
	
	/**
	 * 代客理财
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/step/3", method=RequestMethod.GET)
	public String step_3(HttpServletRequest request){
		return "dklc";
	}
	
	/**
	 * 投资者确认函
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/step/4", method=RequestMethod.GET)
	public String step_4(HttpServletRequest request){
		return "tzzqrh";
	}
	
	/**
	 * 交易账号安全保障确认书
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/step/5", method=RequestMethod.GET)
	public String step_5(HttpServletRequest request){
		return "zhaqbzqr";
	}
	
	/**
	 * 转向到客户填写信息页面
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/step/10", method=RequestMethod.GET)
	public String step_10(){
		return "khxys";
	}
	
	/**
	 * 转向到客户填写信息页面
	 * @param request
	 * @return String
	 */
	@RequestMapping(value="/register/view", method=RequestMethod.GET)
	public String toRegisterView(HttpServletRequest request){
		//request.getSession().setAttribute("_token", "submit_token");
		return "form";
	}
	
	/**
	 * 客户填写信息的form提交到此地址进行信息处理
	 * @param name
	 * @param CID
	 * @param phone
	 * @param QQ
	 * @param email
	 * @param bank
	 * @param card
	 * @param address
	 * @param sfz_1
	 * @param sfz_2
	 * @param sfz_3
	 * @return String
	 */
	@RequestMapping(value="/register/do", method=RequestMethod.POST)
	public String doRegister(String name, 
			String CID, 
			String member, 
			String code, 
			String experience, 
			String amount, // 是否提货 
			String phone,
			String QQ,
			String email,
			String bank, 
			String card, 
			String address, 
			MultipartFile sfz_1,
			MultipartFile sfz_2,
			MultipartFile sfz_3, 
			HttpServletRequest request,
			RedirectAttributesModelMap redirectAttributesModelMap
			){
		if(request.getSession().getAttribute("_token")!=null){
			return "redirect:/register/step/10";
		}
		request.getSession().setAttribute("_token", "submit_token");
		log.info("name:" + name);
		log.info("CID:" + CID);
		log.info("member:" + member);
		log.info("experience:" + experience);
		log.info("phone:" + phone);
		log.info("QQ:" + QQ);
		log.info("email:" + email);
		log.info("bank:" + bank);
		log.info("card:" + card);
		log.info("address:" + address);
		log.info("sfz_1:" + sfz_1.getOriginalFilename() + "|" + sfz_1.getName());
		log.info("sfz_2:" + sfz_2.getOriginalFilename() + "|" + sfz_2.getName());
		log.info("sfz_3:" + sfz_3.getOriginalFilename() + "|" + sfz_3.getName());
		
		if(CheckUtil.isEmpty(name, CID, phone, email, bank, card, address) || sfz_1==null || sfz_2==null || sfz_3==null){
			request.getSession().setAttribute("errorMsg", "服务器繁忙，请稍后再试");
			return "redirect:error";
		}
		
		String sfz_1_url = saveSFZ(request, member, sfz_1);
		String sfz_2_url = saveSFZ(request, member, sfz_2);
		String sfz_3_url = saveSFZ(request, member, sfz_3);
		
		User user = new User(name, CID, phone, QQ, email, address, member, code, bank, card, 0, experience, DateTime.now().toString("yyyy-MM-dd HH:mm:ss"), "信息已提交", sfz_1_url, sfz_2_url, sfz_3_url);
		user.setAmount(amount);
		// 设置用户为被删除状态
		//user.setDeleted(1);
		int id = userService.addBackId(user);
		if(id != -1){
			request.getSession().setAttribute("register_code", id);
			log.info(name + ":[" + member + "]" + "注册成功, 注册编号：" + id);
			// 发送激活邮件
			//mailSenderUtil.sendMail(email, mailSenderUtil.getDefault_subject(), content);
			// 保存用户信息
			user.setId(id); // 保存用户的id
			request.getSession().setAttribute("user", user);
			// 添加member对象
			//redirectAttributesModelMap.addFlashAttribute("member", MemberContext.getByKey(member));
			//redirectAttributesModelMap.addFlashAttribute("name", name);
			//redirectAttributesModelMap.addFlashAttribute("phone", phone);
			return "redirect:/register/step/10";
		}
		request.getSession().setAttribute("errorMsg", "服务器繁忙，请稍后再试");
		return "redirect:error";
	}

	/**
	 * 将上传的身份证照片进行保存，并返回保存路径
	 * 
	 * @return String
	 */
	private String saveSFZ(HttpServletRequest request, String memberNo, MultipartFile sfz) {
		String rootDir = request.getSession().getServletContext().getRealPath("/res/imgs");
		String saveDir = rootDir + "/" + memberNo + "/";
		File file = new File(saveDir);
		if (!file.exists()) {
			file.mkdir();
		}
		String saveUrl = request.getContextPath() + "/res/imgs/" + memberNo + "/";
		if (sfz != null) {
			String fileName = sfz.getOriginalFilename(); // 获取身份证的原始名称
			// 检查扩展名
			String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
			// if(!Arrays.<String>asList(extMap.get("image").split(",")).contains(fileExt)){
			// }
			UUID uuid = UUID.randomUUID(); // 使用uuid对文件进行命名，防止重复
			String newFileName = uuid.toString() + "." + fileExt;
			try {
				Thumbnails.of(sfz.getInputStream()).size(450, 100000) // 将图片进行压缩，以宽度450进行等比例压缩
						.toFile(new File(saveDir + newFileName));
				saveUrl += newFileName;
			} catch (Exception e) {
				log.warn(e.getMessage());
			}
		}
		return saveUrl;
	}
	
	/**
	 * 检验客户填写的身份证是否正确
	 * 1、没有被使用过
	 * 2、符合18位身份证验证标准
	 * @param CID
	 * @return JSONObject
	 */
	@RequestMapping(value="/register/check/CID", method=RequestMethod.POST)
	public @ResponseBody JSONObject checkCID(String CID){
		JSONObject jsonObject = new JSONObject();
		if(!CIDUtils.isIdcard(CID)){
			jsonObject.put("status", 0); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "请填写正确的二代身份证号码");
			return jsonObject;
		}
		if(!userService.isCIDExist(CID)){
			jsonObject.put("status", 1); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "身份证可以使用");
		}else{
			jsonObject.put("status", 0); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "身份证号已注册");
		}
		return jsonObject;
	}
	
	/**
	 * 验证手机号码
	 * 1、手机是否已经被注册过，如果注册过则不可再使用，即验证失败
	 * @param phone
	 * @return JSONObject
	 * */
	@RequestMapping(value="/register/check/phone", method=RequestMethod.POST)
	public @ResponseBody JSONObject checkPhone(String phone){
		JSONObject jsonObject = new JSONObject();
		if(!userService.isPhoneExist(phone)){
			jsonObject.put("status", 1); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "可以注册");
		}else{
			jsonObject.put("status", -1); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "已经注册，不能重复使用");
		}
		return jsonObject;
	}
	
	
	/**
	 * 通过手机发送验证码
	 * 1、手机号码必须是没有注册过的
	 * 2、同一手机号码当天内获取验证码次数不能超过三次
	 * @param phone
	 * @return JSONObject
	 
	@RequestMapping(value="/register/send/yzm", method=RequestMethod.POST)
	public @ResponseBody JSONObject sendYZM(String phone, HttpSession session){
		JSONObject jsonObject = new JSONObject();
		if(phone == null || "".equals(phone)){
			jsonObject.put("status", -4); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "手机号不能为空");
			return jsonObject;
		}
		
		if(!CheckUtil.isAvailablePhone(phone)){
			jsonObject.put("status", -3); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "手机号不正确");
			return jsonObject;
		}
		
		if(userService.isPhoneExist(phone)){
			jsonObject.put("status", -2); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "手机号已被注册");
			return jsonObject;
		}
		
		if(!phoneVerifyService.isAllowedCount(phone)){
			jsonObject.put("status", -1); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "手机号码一天只能获取" + phoneVerifyService.getMaxCount()  + "次");
			return jsonObject;
		}
		String code = RandomUtil.randomCode(4); // 随机产生一个4为验证码
		// 将此手机保存起来
		if(phoneVerifyService.add(phone, code)){
			session.setAttribute("yzm", code);
			jsonObject.put("status", 1); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "验证码已经发送到您的手机请查收");
			return jsonObject;
		}
		jsonObject.put("status", 0); // 验证结果的状态码。1代表验证通过，其他代表不通过
		jsonObject.put("msg", "系统繁忙，请稍后再试");
		return jsonObject;
	}
	*/
	/**
	 * 检测验证码是否正确
	 * @param yzm
	 * @return JSONObject
	@RequestMapping(value="/register/check/yzm", method=RequestMethod.POST)
	public @ResponseBody JSONObject checkYZM(String yzm, HttpSession session){
		JSONObject jsonObject = new JSONObject();
		if(CheckUtil.isEmpty(yzm)){
			jsonObject.put("status", -3); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "验证码不能为空");
			return jsonObject;
		}
		if(!yzm.equals(session.getAttribute("yzm"))){
			jsonObject.put("status", 0); // 验证结果的状态码。1代表验证通过，其他代表不通过
			jsonObject.put("msg", "验证码不正确");
			return jsonObject;
		}
		jsonObject.put("status", 1); // 验证结果的状态码。1代表验证通过，其他代表不通过
		jsonObject.put("msg", "验证码正确");
		return jsonObject;
	}
	 */
	/**
	 * 信息提交成功之后显示的界面
	 * @return String
	 */
	@RequestMapping("/register/success")
	public String success(HttpServletRequest request){
		// 获取之前存入的user对象
		/*
		User user = (User)request.getSession().getAttribute("user");
		int result = userService.updateForDeleted(user.getId());
		if(result == 1){
			request.getSession().invalidate(); // 设置session失效
			return "success";
		}
		return "redirect:/register/error";
		*/
		request.getSession().invalidate(); // 设置session失效
		return "success";
	}
	
	
	/**
	 * 信息提交失败之后显示的界面
	 * @return String
	 */
	@RequestMapping("/register/error")
	public String error(HttpServletRequest request){
		request.getSession().invalidate(); // 设置session失效
		return "error";
	}
	
}

